{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Copyright &copy; 2013 Ondrej Martinsky, All rights reserved\n",
    "\n",
    "[www.quantandfinancial.com](http://www.quantandfinancial.com)\n",
    "# Portfolio Optimization and Black-Litterman"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Mathematical symbols used in this notebook\n",
    "\n",
    "| Python symbol | Math Symbol | Comment\n",
    "| -- | -- | --\n",
    "| rf | $r$ | risk free rate\n",
    "| lmb | $\\lambda$ | risk aversion coefficient\n",
    "| C | $C$ | Assets covariance matrix\n",
    "| V | $V$ | Assets variances (diagonal in covariance matrix)\n",
    "| W | $W$ | Assets weights\n",
    "| R | $R$ | Assets returns\n",
    "| mean | $\\mu$ | Portfolio historical return\n",
    "| var | $\\sigma$ | Portfolio historical variance\n",
    "| Pi | $\\Pi$ | Portfolio equilibrium excess returns\n",
    "| tau | $\\tau$ | Scaling factor for Black-litterman"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using matplotlib backend: Qt4Agg\n",
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "%pylab\n",
    "%matplotlib inline\n",
    "pylab.rcParams['figure.figsize'] = (10, 6)\n",
    "import scipy.optimize\n",
    "from pandas import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Few helper functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Calculates portfolio mean return\n",
    "def port_mean(W, R):\n",
    "    return sum(R * W)\n",
    "\n",
    "# Calculates portfolio variance of returns\n",
    "def port_var(W, C):\n",
    "    return dot(dot(W, C), W)\n",
    "\n",
    "# Combination of the two functions above - mean and variance of returns calculation\n",
    "def port_mean_var(W, R, C):\n",
    "    return port_mean(W, R), port_var(W, C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Given risk-free rate, assets returns and covariances, this function calculates\n",
    "# mean-variance frontier and returns its [x,y] points in two arrays\n",
    "def solve_frontier(R, C, rf):\n",
    "    def fitness(W, R, C, r):\n",
    "        # For given level of return r, find weights which minimizes portfolio variance.\n",
    "        mean, var = port_mean_var(W, R, C)\n",
    "        penalty = 100 * abs(\n",
    "            mean - r)  # Big penalty for not meeting stated portfolio return effectively serves as optimization constraint\n",
    "        return var + penalty\n",
    "\n",
    "    frontier_mean, frontier_var = [], []\n",
    "    n = len(R)  # Number of assets in the portfolio\n",
    "    for r in linspace(min(R), max(R), num=20):  # Iterate through the range of returns on Y axis\n",
    "        W = ones([n]) / n  # start optimization with equal weights\n",
    "        b_ = [(0, 1) for i in range(n)]\n",
    "        c_ = ({'type': 'eq', 'fun': lambda W: sum(W) - 1.})\n",
    "        optimized = scipy.optimize.minimize(fitness, W, (R, C, r), method='SLSQP', constraints=c_, bounds=b_)\n",
    "        if not optimized.success:\n",
    "            raise BaseException(optimized.message)\n",
    "        # add point to the efficient frontier [x,y] = [optimized.x, r]\n",
    "        frontier_mean.append(r)\n",
    "        frontier_var.append(port_var(optimized.x, C))\n",
    "    return array(frontier_mean), array(frontier_var)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Given risk-free rate, assets returns and covariances, this function calculates\n",
    "# weights of tangency portfolio with respect to sharpe ratio maximization\n",
    "def solve_weights(R, C, rf):\n",
    "    def fitness(W, R, C, rf):\n",
    "        mean, var = port_mean_var(W, R, C)  # calculate mean/variance of the portfolio\n",
    "        util = (mean - rf) / sqrt(var)  # utility = Sharpe ratio\n",
    "        return 1 / util  # maximize the utility, minimize its inverse value\n",
    "    n = len(R)\n",
    "    W = ones([n]) / n  # start optimization with equal weights\n",
    "    b_ = [(0., 1.) for i in range(n)]  # weights for boundaries between 0%..100%. No leverage, no shorting\n",
    "    c_ = ({'type': 'eq', 'fun': lambda W: sum(W) - 1.})  # Sum of weights must be 100%\n",
    "    optimized = scipy.optimize.minimize(fitness, W, (R, C, rf), method='SLSQP', constraints=c_, bounds=b_)\n",
    "    if not optimized.success: raise BaseException(optimized.message)\n",
    "    return optimized.x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "class Result:\n",
    "    def __init__(self, W, tan_mean, tan_var, front_mean, front_var):\n",
    "        self.W=W\n",
    "        self.tan_mean=tan_mean\n",
    "        self.tan_var=tan_var\n",
    "        self.front_mean=front_mean\n",
    "        self.front_var=front_var\n",
    "        \n",
    "def optimize_frontier(R, C, rf):\n",
    "    W = solve_weights(R, C, rf)\n",
    "    tan_mean, tan_var = port_mean_var(W, R, C)  # calculate tangency portfolio\n",
    "    front_mean, front_var = solve_frontier(R, C, rf)  # calculate efficient frontier\n",
    "    # Weights, Tangency portfolio asset means and variances, Efficient frontier means and variances\n",
    "    return Result(W, tan_mean, tan_var, front_mean, front_var)\n",
    "\n",
    "def display_assets(names, R, C, color='black'):\n",
    "    scatter([C[i, i] ** .5 for i in range(n)], R, marker='x', color=color), grid(True)  # draw assets\n",
    "    for i in range(n): \n",
    "        text(C[i, i] ** .5, R[i], '  %s' % names[i], verticalalignment='center', color=color) # draw labels\n",
    "\n",
    "def display_frontier(result, label=None, color='black'):\n",
    "    text(result.tan_var ** .5, result.tan_mean, '   tangent', verticalalignment='center', color=color)\n",
    "    scatter(result.tan_var ** .5, result.tan_mean, marker='o', color=color), grid(True)\n",
    "    plot(result.front_var ** .5, result.front_mean, label=label, color=color), grid(True)  # draw efficient frontier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load historical prices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Function loads historical stock prices of nine major S&P companies and returns them together\n",
    "# with their market capitalizations, as of 2013-07-01\n",
    "def load_data():\n",
    "    symbols = ['XOM', 'AAPL', 'MSFT', 'JNJ', 'GE', 'GOOG', 'CVX', 'PG', 'WFC']\n",
    "    cap = {'XOM': 403.02e9, 'AAPL': 392.90e9, 'MSFT': 283.60e9, 'JNJ': 243.17e9, 'GE': 236.79e9,\n",
    "           'GOOG': 292.72e9, 'CVX': 231.03e9, 'PG': 214.99e9, 'WFC': 218.79e9}\n",
    "    n = len(symbols)\n",
    "    prices_out, caps_out = [], []\n",
    "    for s in symbols:\n",
    "        dataframe = pandas.read_csv('data/%s.csv' % s, index_col=None, parse_dates=['date'])\n",
    "        prices = list(dataframe['close'])[-500:] # trailing window 500 days\n",
    "        prices_out.append(prices)\n",
    "        caps_out.append(cap[s])\n",
    "    return symbols, prices_out, caps_out\n",
    "\n",
    "names, prices, caps = load_data()\n",
    "n = len(names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Estimate assets historical return and covariances"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Function takes historical stock prices together with market capitalizations and\n",
    "# calculates weights, historical returns and historical covariances\n",
    "def assets_historical_returns_and_covariances(prices):\n",
    "    prices = matrix(prices)  # create numpy matrix from prices\n",
    "    # create matrix of historical returns\n",
    "    rows, cols = prices.shape\n",
    "    returns = empty([rows, cols - 1])\n",
    "    for r in range(rows):\n",
    "        for c in range(cols - 1):\n",
    "            p0, p1 = prices[r, c], prices[r, c + 1]\n",
    "            returns[r, c] = (p1 / p0) - 1\n",
    "    # calculate returns\n",
    "    expreturns = array([])\n",
    "    for r in range(rows):\n",
    "        expreturns = append(expreturns, numpy.mean(returns[r]))\n",
    "    # calculate covariances\n",
    "    covars = cov(returns)\n",
    "    expreturns = (1 + expreturns) ** 250 - 1  # Annualize returns\n",
    "    covars = covars * 250  # Annualize covariances\n",
    "    return expreturns, covars\n",
    "\n",
    "W = array(caps) / sum(caps) # calculate market weights from capitalizations\n",
    "R, C = assets_historical_returns_and_covariances(prices)\n",
    "rf = .015  # Risk-free rate"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Asset returns and weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>XOM</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>MSFT</th>\n",
       "      <th>JNJ</th>\n",
       "      <th>GE</th>\n",
       "      <th>GOOG</th>\n",
       "      <th>CVX</th>\n",
       "      <th>PG</th>\n",
       "      <th>WFC</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Return</th>\n",
       "      <td>0.072993</td>\n",
       "      <td>0.129536</td>\n",
       "      <td>0.172047</td>\n",
       "      <td>0.143764</td>\n",
       "      <td>0.140385</td>\n",
       "      <td>0.331958</td>\n",
       "      <td>0.092131</td>\n",
       "      <td>0.112222</td>\n",
       "      <td>0.268935</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Weight (based on market cap)</th>\n",
       "      <td>0.160119</td>\n",
       "      <td>0.156098</td>\n",
       "      <td>0.112673</td>\n",
       "      <td>0.096611</td>\n",
       "      <td>0.094076</td>\n",
       "      <td>0.116297</td>\n",
       "      <td>0.091787</td>\n",
       "      <td>0.085415</td>\n",
       "      <td>0.086925</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                   XOM      AAPL      MSFT       JNJ  \\\n",
       "Return                        0.072993  0.129536  0.172047  0.143764   \n",
       "Weight (based on market cap)  0.160119  0.156098  0.112673  0.096611   \n",
       "\n",
       "                                    GE      GOOG       CVX        PG       WFC  \n",
       "Return                        0.140385  0.331958  0.092131  0.112222  0.268935  \n",
       "Weight (based on market cap)  0.094076  0.116297  0.091787  0.085415  0.086925  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(pandas.DataFrame({'Return': R, 'Weight (based on market cap)': W}, index=names).T)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Asset covariances"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>XOM</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>MSFT</th>\n",
       "      <th>JNJ</th>\n",
       "      <th>GE</th>\n",
       "      <th>GOOG</th>\n",
       "      <th>CVX</th>\n",
       "      <th>PG</th>\n",
       "      <th>WFC</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>XOM</th>\n",
       "      <td>0.039015</td>\n",
       "      <td>0.022296</td>\n",
       "      <td>0.027982</td>\n",
       "      <td>0.019595</td>\n",
       "      <td>0.036647</td>\n",
       "      <td>0.026728</td>\n",
       "      <td>0.038245</td>\n",
       "      <td>0.018216</td>\n",
       "      <td>0.042972</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AAPL</th>\n",
       "      <td>0.022296</td>\n",
       "      <td>0.091844</td>\n",
       "      <td>0.024599</td>\n",
       "      <td>0.011578</td>\n",
       "      <td>0.027814</td>\n",
       "      <td>0.033249</td>\n",
       "      <td>0.028240</td>\n",
       "      <td>0.011532</td>\n",
       "      <td>0.036756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MSFT</th>\n",
       "      <td>0.027982</td>\n",
       "      <td>0.024599</td>\n",
       "      <td>0.051014</td>\n",
       "      <td>0.016842</td>\n",
       "      <td>0.032649</td>\n",
       "      <td>0.026231</td>\n",
       "      <td>0.030815</td>\n",
       "      <td>0.013724</td>\n",
       "      <td>0.040321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>JNJ</th>\n",
       "      <td>0.019595</td>\n",
       "      <td>0.011578</td>\n",
       "      <td>0.016842</td>\n",
       "      <td>0.019456</td>\n",
       "      <td>0.021048</td>\n",
       "      <td>0.015547</td>\n",
       "      <td>0.021005</td>\n",
       "      <td>0.013196</td>\n",
       "      <td>0.026861</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>GE</th>\n",
       "      <td>0.036647</td>\n",
       "      <td>0.027814</td>\n",
       "      <td>0.032649</td>\n",
       "      <td>0.021048</td>\n",
       "      <td>0.059233</td>\n",
       "      <td>0.031083</td>\n",
       "      <td>0.040677</td>\n",
       "      <td>0.019377</td>\n",
       "      <td>0.053928</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>GOOG</th>\n",
       "      <td>0.026728</td>\n",
       "      <td>0.033249</td>\n",
       "      <td>0.026231</td>\n",
       "      <td>0.015547</td>\n",
       "      <td>0.031083</td>\n",
       "      <td>0.066899</td>\n",
       "      <td>0.030258</td>\n",
       "      <td>0.015123</td>\n",
       "      <td>0.039019</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CVX</th>\n",
       "      <td>0.038245</td>\n",
       "      <td>0.028240</td>\n",
       "      <td>0.030815</td>\n",
       "      <td>0.021005</td>\n",
       "      <td>0.040677</td>\n",
       "      <td>0.030258</td>\n",
       "      <td>0.050857</td>\n",
       "      <td>0.019587</td>\n",
       "      <td>0.048326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PG</th>\n",
       "      <td>0.018216</td>\n",
       "      <td>0.011532</td>\n",
       "      <td>0.013724</td>\n",
       "      <td>0.013196</td>\n",
       "      <td>0.019377</td>\n",
       "      <td>0.015123</td>\n",
       "      <td>0.019587</td>\n",
       "      <td>0.025152</td>\n",
       "      <td>0.022479</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>WFC</th>\n",
       "      <td>0.042972</td>\n",
       "      <td>0.036756</td>\n",
       "      <td>0.040321</td>\n",
       "      <td>0.026861</td>\n",
       "      <td>0.053928</td>\n",
       "      <td>0.039019</td>\n",
       "      <td>0.048326</td>\n",
       "      <td>0.022479</td>\n",
       "      <td>0.089826</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           XOM      AAPL      MSFT       JNJ        GE      GOOG       CVX  \\\n",
       "XOM   0.039015  0.022296  0.027982  0.019595  0.036647  0.026728  0.038245   \n",
       "AAPL  0.022296  0.091844  0.024599  0.011578  0.027814  0.033249  0.028240   \n",
       "MSFT  0.027982  0.024599  0.051014  0.016842  0.032649  0.026231  0.030815   \n",
       "JNJ   0.019595  0.011578  0.016842  0.019456  0.021048  0.015547  0.021005   \n",
       "GE    0.036647  0.027814  0.032649  0.021048  0.059233  0.031083  0.040677   \n",
       "GOOG  0.026728  0.033249  0.026231  0.015547  0.031083  0.066899  0.030258   \n",
       "CVX   0.038245  0.028240  0.030815  0.021005  0.040677  0.030258  0.050857   \n",
       "PG    0.018216  0.011532  0.013724  0.013196  0.019377  0.015123  0.019587   \n",
       "WFC   0.042972  0.036756  0.040321  0.026861  0.053928  0.039019  0.048326   \n",
       "\n",
       "            PG       WFC  \n",
       "XOM   0.018216  0.042972  \n",
       "AAPL  0.011532  0.036756  \n",
       "MSFT  0.013724  0.040321  \n",
       "JNJ   0.013196  0.026861  \n",
       "GE    0.019377  0.053928  \n",
       "GOOG  0.015123  0.039019  \n",
       "CVX   0.019587  0.048326  \n",
       "PG    0.025152  0.022479  \n",
       "WFC   0.022479  0.089826  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(pandas.DataFrame(C, columns=names, index=names))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mean-Variance Optimization (based on historical returns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15ce47f5f28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>XOM</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>MSFT</th>\n",
       "      <th>JNJ</th>\n",
       "      <th>GE</th>\n",
       "      <th>GOOG</th>\n",
       "      <th>CVX</th>\n",
       "      <th>PG</th>\n",
       "      <th>WFC</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Weight</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.545520e-18</td>\n",
       "      <td>0.450921</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.528356</td>\n",
       "      <td>3.125863e-17</td>\n",
       "      <td>1.289740e-17</td>\n",
       "      <td>0.020723</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        XOM  AAPL          MSFT       JNJ   GE      GOOG           CVX  \\\n",
       "Weight  0.0   0.0  2.545520e-18  0.450921  0.0  0.528356  3.125863e-17   \n",
       "\n",
       "                  PG       WFC  \n",
       "Weight  1.289740e-17  0.020723  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "res1 = optimize_frontier(R, C, rf)\n",
    "\n",
    "display_assets(names, R, C, color='blue')\n",
    "display_frontier(res1, color='blue')\n",
    "xlabel('variance $\\sigma$'), ylabel('mean $\\mu$'), show()\n",
    "display(pandas.DataFrame({'Weight': res1.W}, index=names).T)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Black-litterman reverse optimization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Calculate portfolio historical return and variance\n",
    "mean, var = port_mean_var(W, R, C)\n",
    "\n",
    "lmb = (mean - rf) / var  # Calculate risk aversion\n",
    "Pi = dot(dot(lmb, C), W)  # Calculate equilibrium excess returns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Mean-variance Optimization (based on equilibrium returns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnIAAAGBCAYAAADiwFy/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8zlf/x/HXN8QWBDVDqNGitbcSdBkt2lpt1WjdWrSq\n7e8uVSO9W7rc3UOXUlXK3Rbdg9iKoipW0dgjBCFmkvP748gliSAkua7rm7yfj0ceub7zOl8nV3xy\nzuec4xhjEBERERH3CfB1AURERETk6iiQExEREXEpBXIiIiIiLqVATkRERMSlFMiJiIiIuJQCORER\nERGX8log5zjO7Y7jbHQcZ7PjOE9f4ryGjuOcdRznriu9VkRERCQncbwxj5zjOAHAZqAtsAdYAfQw\nxmxM47xfgJPAJ8aYr9J7rYiIiEhO460WuUbA38aY7caYs8A0oFMa5z0KzAQOXMW1IiIiIjmKtwK5\ncsDOZNu7zu3zcBynLNDZGPMe4FzJtSIiIiI5kT8NdngdUP6biIiISDrl9tL77AYqJNsuf25fcg2A\naY7jOEAJoJ3jOPHpvBYAx3G0cKyIiIi4hjHGufxZF+etQG4FUMVxnIrAXqAH0DP5CcaYykmvHceZ\nCMwxxsx2HCfX5a5NdZ8sKL5ktTFjxjBmzBhfF0OukurPvVR37qb6czfbdpUxXgnkjDEJjuMMBn7G\ndud+bIzZ4DjOAHvYfJD6kstd641yi/dERUX5ugiSAao/91LduZvqT7zVIocx5kegeqp9Ey5ybr/L\nXSsiIiKS0/nTYAfJwfr06ePrIkgGqP7cS3Xnbqo/8cqEwN7iOI7JTs8jIiIi2ZfjOBke7KAWOfEL\nERERvi6CZIDqz71Ud2kLDQ3FcRx96StTvkJDQ7PsZ9VrOXIiIiJusX37ds2CIJnGcTI+OvWi985O\nP6iOulZFRCQTOI6jQE4yzcV+ns7tV9eqiIiISE6kQE78gvJ03E31516qOxF3UyAnIiKSDdWqVYsF\nCxZk+fvs3LmToKCgDHdFt27dmk8++SSTSpVzKJATvxAWFubrIkgGqP7cS3XnTpUqVWLu3Lkp9k2a\nNImbbrrJs71u3Tpatmx5yfts376dgIAAEhMTr7osISEhxMbGZmlC/5XKjOdyCwVyIiIi2cSVBlPG\nmAwN7EhISLiq6zLqcu+b0edKuocbKJATv6A8HXdT/bmX6i77St5qt2LFCho2bEiRIkUoU6YMTz31\nFACtWrUCoGjRogQFBfH7779jjOH5558nNDSU0qVL06dPH2JjY4HzLV2ffPIJFStWpG3bthe0fh0+\nfJh+/fpRrlw5ihcvzl133QXAkSNHuOOOO7jmmmsoXrw4d9xxB7t3707Xs4SHh9O1a1d69epF0aJF\nmTRpEsYYXnzxRapUqULJkiXp0aMHR44cuehzhYeH06tXL889U5e7devWPPvss7Ro0YKCBQvyzz//\n0Lp1a0aNGkWLFi0ICgri9ttvJyYmBoDTp0/Tq1cvSpQoQbFixWjcuDHR0dFXX2FXSYGciIhINnCp\nFqQhQ4bw+OOPc/ToUbZu3Uq3bt0APDl0sbGxxMbG0rhxYyZOnMjkyZOZP38+27Zt49ixYwwePDjF\n/RYsWMDGjRv56aefgJQtgffffz8nT55kw4YNHDhwgKFDhwKQmJhIv3792LlzJzt27KBAgQIX3PdS\nZs+eTbdu3Thy5Aj33Xcfb775JrNnz2bhwoXs2bOHYsWKMXDgwIs+V+pyprU9ZcoUPvroI44dO0aF\nChUA+OKLL5g0aRLR0dGcPn2aV199FbBd2bGxsezevZuYmBjef/998ufPn+7nySyaEFj8gvJ03E31\n516qO/fq3LkzuXOf/2/89OnT1K9fP81z8+TJw5YtWzh06BDFixenUaNGKY4ndUUCTJ06lSeeeIKK\nFSsCMG7cOGrVqsWnn34K2OAnPDw8zaBl7969/PTTT8TExBAUFATgydsLDg6mS5cuAOTNm5fhw4fT\ntm3bdD9v06ZNueOOOzzXT5gwgXfeeYcyZcoAMGrUKCpWrMiUKVM8QW3y50qPPn36cN111wEQEGDb\nuvr27cu1114LQLdu3ZgzZw4AgYGBHDp0iM2bN3PDDTdQt27ddL9PZlKLnIiIyNVwnIx/ZcCsWbOI\niYnxfL377rsXPffjjz9m06ZNXHfddTRu3Jjvvvvuoufu2bPHE8QBVKxYkfj4ePbv3+/ZV758+TSv\n3bVrF8HBwZ4gLrmTJ08yYMAAQkNDKVq0KK1ateLIkSPpzkULCQlJsb19+3a6dOlCcHAwwcHB1KhR\ng8DAQPbv33/VAy9SvwdA6dKlPa8LFCjA8ePHAejVqxe33XYbPXr0oHz58gwbNswnOYMK5MQvKE/H\n3VR/7qW6ywBjMv6VobdP//XXXnstU6dOJTo6mn//+9/cc889nDx5Ms2Ap2zZsmzfvt2zvX37dgID\nAylVqpRn38UCpZCQEGJiYjw5dcmNHz+ev//+mxUrVnDkyBFP92d6nyP1e1aoUIEffvjBE8gePnyY\nuLg4ypQpk2b5ChYsyIkTJzzbe/fuvex7XEru3LkZOXIkkZGRLFmyhDlz5jB58uR0X59ZFMiJiIhk\nc59//jkHDx4EoEiRIjiOQ0BAACVLliQgIICtW7d6zu3ZsyevvfYaUVFRHD9+nBEjRtCjRw9PV2Na\ngVfSvtKlS9OuXTsGDhzIkSNHOHv2LAsXLgTg2LFj5M+fn6CgIGJiYhgzZkyGnmnAgAE888wz7Nix\nA4Do6Ghmz54NkOZz1alThwULFrBz506OHj3Kiy++mKH3j4iIYN26dSQmJlKoUCECAwM9/0bepEBO\n/ILydNxN9edeqjt3Sk/LUfJzfvzxR2rWrElQUBBDhw5l+vTp5M2bl/z58zNixAiaN29OcHAwy5cv\np1+/fvTq1YuWLVty7bXXUqBAAd58881LvnfyfZ999hm5c+fmuuuuo3Tp0rzxxhsAPP7445w4cYIS\nJUrQrFkz2rdvf8XPlNyQIUPo1KkTt956K0WKFKFZs2YsX74cIM3nuvnmm+nevTs33ngjDRs29OTb\npfe5Utu3bx/33HMPRYoUoWbNmrRu3TrFqFhvcdwyT0p6OI5jstPziIiIb2R0DjKR5C7283Ruf4aS\nJdUiJ35BeTrupvpzL9WdiLspkBMRERFxKXWtioiIpKKuVclM6loVERERkQsokBO/oDwdd1P9uZfq\nTsTdFMiJiIiIuJRy5ERERFJRjpxkJuXIiYiIiMgFFMiJX1Cejrup/txLdSepBQQEsG3bNgAeeeQR\nXnjhhau6T9++fRk1alRmFk3SoEBORETEZSpVqsTcuXOz5N7Jl6V67733GDFiRJa8z5VKHmDKeQrk\nxC9ovUd3U/25l+pOUvNFbmBCQsJlz7nStVhTS0xMzND1/kqBnIiIiItNmjSJFi1a8MQTT1CsWDGq\nVKnC0qVLmTRpEhUqVKB06dJMnjzZc37fvn155JFHuPXWWwkKCqJ169bs2LEjzXun7h799ttvqVu3\nLsWKFaNFixb89ddfnmOrV6+mfv36FClShB49enDq1Kl0lblEiRKEh4cD8Mknn1CjRg2KFy9Ou3bt\n2LlzJwCtWrXCGMONN95IUFAQM2bMYNKkSdx0000p7pu81a5v374MHDiQDh06ULhwYSIiIujbty+D\nBw+mY8eOBAUF0bRpU/755x/P9UOHDqVUqVIUKVKE2rVrs379+vRWg88okBO/oDwdd1P9uZfqLntY\nvnw5derUISYmhp49e9KjRw9WrlzJ1q1b+eyzzxg8eDAnTpzwnD916lRGjx7NoUOHqF27Nvfdd99l\n32P16tU8+OCDfPjhh8TExDBgwADuvPNOzp49y9mzZ+nSpQu9e/cmJiaGrl278r///e+S9/v999+p\nUqUKBw4cYMSIEcyaNYsXX3yRb775hujoaG666SZ69OgBwPz58wH466+/iI2NpWvXrsCFrXSpt7/4\n4gtGjhzJsWPHaN68OQDTp08nPDycI0eOcO2113q6jn/++WcWLVrEli1bOHr0KF9++SXFixe/7L+L\nrymQExERcblKlSrxwAMP4DgO3bt3Z9euXYwePZrAwEBuueUW8uTJw5YtWzznd+jQgebNmxMYGMgL\nL7zA0qVL2b179yXf48MPP+Thhx+mQYMGOI5Dr169yJs3L8uWLWPZsmXEx8fz2GOPkStXLu6++24a\nNmx4yfuVK1eOgQMHEhAQQN68eZkwYQLDhw+nWrVqBAQEMGzYMNasWeNplYPLd/umPt6pUyeaNGkC\nQN68eQHo0qUL9evXJyAggPvuu481a9YAEBgYyLFjx1i/fj3GGKpXr06pUqUu+X7+ILevCyACytNx\nO9Wfe6nurp4TnrGcLQAzOnPy0ZIHHPnz5wegRIkSKfYdP37csx0SEuJ5XbBgQYKDg9mzZw/lypW7\n6Hts376dyZMn89Zbb9myG8PZs2fZs2cPwAXXVqxY8ZJlTl6GpPsPGTKEJ5980nN/x3HYvXv3Beem\nV1rXlS5d2vO6QIECnn+X1q1bM3jwYAYNGsSOHTu46667ePXVVylUqNBVvbe3KJATERG5CpkVhPlC\n8lau48ePExMTc8kgDmxQNGLECIYPH37BsQULFlzQordjxw6qVKly0ful7gatUKECzz77LD179kzP\nI1CwYMEU3cX79u277HtczuDBgxk8eDAHDx6ka9euvPLKK578PX+lrlXxC8rTcTfVn3up7rKny3VB\nfv/99yxZsoQzZ84wcuRImjZtStmyZS95Tf/+/Xn//fdZvnw5AHFxcXz//ffExcXRtGlTcufOzVtv\nvUV8fDxfffWV57z0GjBgAGPHjvUMMDh69CgzZ870HC9dunSK6Udq165NZGQka9eu5fTp04SHh2do\n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\niU+M59m5z/LVhq8IyhtE3tx5GdlyJF9GfknT8k3pX7+/59xZG2fxwaoPmNBxAi0ntmTVgFUUzVeU\nwycPU/+D+kT0ibiiwR0RUREX/KedOpgb9usw9sft5/0O75M3d14SEhOo+W5Nfu71MxWKVFCOXDY0\nJmKMJ7gfEzbmguMNPmjA/rj9BAYEYjDsPbaXyIGRVCpWifL/LU9grkByOblINInEnIxh75N7KZin\n4EVz4ZQjd3WUIydZIyEBevaE++9XECcpJCQmsGzXMk/wFncmjjur38molqMICw0jb+68vi6iTzz7\nUGX2n4lh/eQj5A7ITXRcNPMHdeDeFX8x9t9R9K/3EDz+OMydy7TGO7n3UHHKN09gYMOBPN0vhAmR\nlRlWdzcPn8hLhbpRMKSTTWXYvh2KFLFfJUvCzz+neN+ExASG/zbcE7yFhYZdkCMH8Hyb5xk5dyS1\n3qtFUN4g8ufOT+/avT05UafiT6XIkbu9yu2MbTvWm/+EkokioiJ4Z8U7jG41mndWvOP52Uiy+dBm\n4s7GsXPoTs++8Ihwpv41lSblm1C7dG1+uO8Hz7G+s/ry9cavuf/G+y+aC6ccOR8yxmSbL/s4kmHP\nPGNM27bGxMd77S3nzZvntfeSKxN3Js7M2jjL9Pumn7nmlWvMDe/eYJ797VmzYvcKk5iYaIzJ3vUX\nnxB/ye0TZ06Y4iNym+P1ahmzeLHdeeSIMY0bm4TChUzZ8WXNvs/eM6ZrVxN3Js6UfLmkORa12Zgj\nR8zZhLOm9mN5zOtzx5pa79a64N6mb19j/ve/DJXvcrJz3eUEqesvPiHeNPmoiZn3j90/7595pslH\nTVL8XIRHhJvhvw5Pcd3afWtNjXdqmH7f9DMTVk5IcWz2xtmm/eftjTHGFB5bOM1y5ArPZUL+G2LK\n/7e8CflviHlt6WsZfLKc4VzckqHYRy1yktLs2fDZZ/DHH5Dr4gnTkr0diDvAt5u/ZdamWcz7Zx4N\nyjagU/VOPNvyWSoVq+Tr4nlNQmICLT5pzribXzw/KvTXYSzqtzjlqNBT+SjY9T744gs7Vc9XX8Fd\ndxGwfj13X383X679mUfLhDBn0xzCQsMoVLEqYLtEXl5ZjNuDR/DrA79eOEghHakiqa+51EAHyf5y\nBeRK0SIbFhp2QQvtqFYXTiN1Q6kbiBwYmeY976h+B3dUvwPgot2n8aPiM1p0uUoatSrnbdkCDz0E\n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\nEfFR/x+inEg7IZ37yAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15ce4f7fd30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>XOM</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>MSFT</th>\n",
       "      <th>JNJ</th>\n",
       "      <th>GE</th>\n",
       "      <th>GOOG</th>\n",
       "      <th>CVX</th>\n",
       "      <th>PG</th>\n",
       "      <th>WFC</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Weight</th>\n",
       "      <td>0.160429</td>\n",
       "      <td>0.15617</td>\n",
       "      <td>0.112453</td>\n",
       "      <td>0.097424</td>\n",
       "      <td>0.093807</td>\n",
       "      <td>0.116209</td>\n",
       "      <td>0.091813</td>\n",
       "      <td>0.084692</td>\n",
       "      <td>0.087002</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             XOM     AAPL      MSFT       JNJ        GE      GOOG       CVX  \\\n",
       "Weight  0.160429  0.15617  0.112453  0.097424  0.093807  0.116209  0.091813   \n",
       "\n",
       "              PG       WFC  \n",
       "Weight  0.084692  0.087002  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "res2 = optimize_frontier(Pi+rf, C, rf)\n",
    "\n",
    "display_assets(names, R, C, color='red')\n",
    "display_frontier(res1, label='Historical returns', color='red')\n",
    "display_assets(names, Pi+rf, C, color='green')\n",
    "display_frontier(res2, label='Implied returns', color='green')\n",
    "xlabel('variance $\\sigma$'), ylabel('mean $\\mu$'), legend(), show()\n",
    "display(pandas.DataFrame({'Weight': res2.W}, index=names).T)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Determine views to the equilibrium returns and prepare views (Q) and link (P) matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Views Matrix\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Views</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.02</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Views\n",
       "0   0.02\n",
       "1   0.02"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Link Matrix\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1    2    3    4    5    6    7    8\n",
       "0  0.0  0.0  1.0  0.0 -1.0  0.0  0.0  0.0  0.0\n",
       "1  0.0 -1.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_views_and_link_matrix(names, views):\n",
    "    r, c = len(views), len(names)\n",
    "    Q = [views[i][3] for i in range(r)]  # view matrix\n",
    "    P = zeros([r, c])\n",
    "    nameToIndex = dict()\n",
    "    for i, n in enumerate(names):\n",
    "        nameToIndex[n] = i\n",
    "    for i, v in enumerate(views):\n",
    "        name1, name2 = views[i][0], views[i][2]\n",
    "        P[i, nameToIndex[name1]] = +1 if views[i][1] == '>' else -1\n",
    "        P[i, nameToIndex[name2]] = -1 if views[i][1] == '>' else +1\n",
    "    return array(Q), P\n",
    "\n",
    "views = [('MSFT', '>', 'GE', 0.02),\n",
    "         ('AAPL', '<', 'JNJ', 0.02)]\n",
    "\n",
    "Q, P = create_views_and_link_matrix(names, views)\n",
    "print('Views Matrix')\n",
    "display(DataFrame({'Views':Q}))\n",
    "print('Link Matrix')\n",
    "display(DataFrame(P))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Optimization based on Equilibrium returns with adjusted views"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\ndh5MgAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15ce4c67a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>XOM</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>MSFT</th>\n",
       "      <th>JNJ</th>\n",
       "      <th>GE</th>\n",
       "      <th>GOOG</th>\n",
       "      <th>CVX</th>\n",
       "      <th>PG</th>\n",
       "      <th>WFC</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Weight</th>\n",
       "      <td>0.160429</td>\n",
       "      <td>0.15617</td>\n",
       "      <td>0.112453</td>\n",
       "      <td>0.097424</td>\n",
       "      <td>0.093807</td>\n",
       "      <td>0.116209</td>\n",
       "      <td>0.091813</td>\n",
       "      <td>0.084692</td>\n",
       "      <td>0.087002</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             XOM     AAPL      MSFT       JNJ        GE      GOOG       CVX  \\\n",
       "Weight  0.160429  0.15617  0.112453  0.097424  0.093807  0.116209  0.091813   \n",
       "\n",
       "              PG       WFC  \n",
       "Weight  0.084692  0.087002  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "tau = .025  # scaling factor\n",
    "\n",
    "# Calculate omega - uncertainty matrix about views\n",
    "omega = dot(dot(dot(tau, P), C), transpose(P))  # 0.025 * P * C * transpose(P)\n",
    "# Calculate equilibrium excess returns with views incorporated\n",
    "sub_a = inv(dot(tau, C))\n",
    "sub_b = dot(dot(transpose(P), inv(omega)), P)\n",
    "sub_c = dot(inv(dot(tau, C)), Pi)\n",
    "sub_d = dot(dot(transpose(P), inv(omega)), Q)\n",
    "Pi_adj = dot(inv(sub_a + sub_b), (sub_c + sub_d))\n",
    "\n",
    "res3 = optimize_frontier(Pi + rf, C, rf)\n",
    "\n",
    "display_assets(names, Pi+rf, C, color='green')\n",
    "display_frontier(res2, label='Implied returns', color='green')\n",
    "display_assets(names, Pi_adj+rf, C, color='blue')\n",
    "display_frontier(res3, label='Implied returns (adjusted views)', color='blue')\n",
    "xlabel('variance $\\sigma$'), ylabel('mean $\\mu$'), legend(), show()\n",
    "display(pandas.DataFrame({'Weight': res2.W}, index=names).T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [Root]",
   "language": "python",
   "name": "Python [Root]"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
